package com.njtech.pet.dao;

import com.njtech.pet.entity.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;


/**
 * @author lxj
 * Date:2020-03-08 16:26
 * Description:<描述>
 */
public interface UserDao {
    /**
     * 新增一个用户
     * @param user 用户数据
     * @return 插入行数
     */
    int insert(User user);

    /**
     * 更新一个用户的信息，仅能修改用户名和密码
     * @param user 用户数据
     * @return 更新行数
     */
    int updateByUserId(User user);

    /**
     * 根据用户ID查询某个用户信息 用户必须是已存在的，这样才能保证返回结果唯一
     * @param user 可能是根据id查询可能是根据名字查询，会根据对应成员变量是否为NULL确定查询依据
     * @return 用户
     */
    User selectByUserNameAndUserId(User user);

    /**
     * 根据用户名和用户状态查找用户，由于可能会有多个用户返回结果，所以返回的List
     * @param username 欲查找的用户名
     * @param state 用户状态
     * @return 用户列表
     */
    List<User> selectByUserNameAndState(@Param("username") String username, @Param("state") String state);

    /**
     * select by user id
     * @param id user id
     * @return result
     */
    User selectByUserId(@Param("id") Integer id);

    /**
     * 更新用户的积分
     * @param uid 用户id
     * @param credit 积分的变化值，可正可负
     * @return 影响行数
     */
    int updateUserCredit(@Param("uid") Integer uid, @Param("credit") Integer credit);

    /**
     * 根据level来查询用户，由于可能会有多个用户返回结果，所以返回的List
     * @param level 用户等级
     * @return 用户列表
     */
    List<User> selectByUserLevel(@Param("level") Integer level);

    /**
     * 根据用户封装的id、用户名（用户名单关键字模糊查询）、性别、角色、状态 以及提供的创建和修改日期的起止日期范围进行灵活选择
     * @param user
     * @param beginCreateDate
     * @param endCreateDate
     * @param beginUpdateDate
     * @param endUpdateDate
     * @return
     */
    List<User> selectElasticly(@Param("user") User user, @Param("beginCreateDate") String beginCreateDate, @Param("endCreateDate") String endCreateDate, @Param("beginUpdateDate") String beginUpdateDate, @Param("endUpdateDate") String endUpdateDate);

}
